package org.blogwu.learn.threadLearn.自己实现一个重入锁.使用AQS;


import java.util.concurrent.locks.AbstractQueuedSynchronizer;

/**
 * 自己实现一个锁
 * implements Lock
 *
 * @author hyf
 * @date 2019-06-02
 **/
public class MyLock {
    // 定义一个同步器，实现AQS类
    private static class Sync extends AbstractQueuedSynchronizer {
        // 实现tryAcquire(acquires)方法
        @Override
        public boolean tryAcquire(int acquires) {
            // 争抢共享变量
            if (compareAndSetState(0, 1)) {
                // 设置线程拥有者
                setExclusiveOwnerThread(Thread.currentThread());
                return true;
            }
            return false;
        }

        // 实现tryRelease(releases)方法
        @Override
        protected boolean tryRelease(int releases) {
            // 这有BUG。应该判断这个线程是不是和锁持有线程 一样。
            setExclusiveOwnerThread(null);
            // 设置克争抢
            setState(0);
            return true;
        }
    }

    // 声明同步器
    private final Sync sync = new Sync();

    // 加锁
    public void lock() {
        sync.acquire(1);
    }

    // 解锁
    public void unlock() {
        sync.release(1);
    }
}
